\documentclass[10.5pt, a4paper]{article}

\usepackage{xeCJK}
\newCJKfontfamily{\heiti}[AutoFakeBold={3.17}]{SimHei}

\usepackage{geometry}
\geometry{
    left = 0.6in,
    right = 0.6in,
    top = 0.8in,
    bottom = 1.0in
}
\usepackage{amssymb,amsbsy,amsmath,xcolor,mathrsfs,graphicx,tikz,xcolor}
\usepackage{listings}
\usepackage{tasks}
\settasks{
    label = \Alph*. ,
    label-width = 16pt
}

\renewcommand{\title}[3]{
    \begin{center}
        \Large\heiti #1~年~#2~月 Python~#3级考试
    \end{center}
}
\newcommand{\TimeAndName}[1]{
    \begin{center}
        考试时间:~#1~ 分钟 \qquad\qquad\qquad\qquad 姓名:\underline{\quad\quad\quad\quad}
    \end{center}
}

\begin{document}
    \lstset{
        language = python,
        keywordstyle = \color{orange}\bfseries,
        emph = {print,bool,chr,ord,sorted,float,type,oct,hex,abs,sum,len,int,open,list,map,
        str,min,input,max,range,divmod,ascii,round,all,bin},
        emphstyle = \color{purple}\bfseries,
        showspaces = false,
        basicstyle = \ttfamily,
        morekeywords = {True,False}
    }

    \title{2020}{9}{三}
    
    \TimeAndName{60}
    
    \vspace{1cm}
    {\noindent\heiti 第一部分、单选题(共 25 题,每题 2 分,共50分.)}

    \begin{enumerate}
        % 1
        \item 下列程序运行结果是?(\qquad)
        \begin{lstlisting}
            a = 12
            b = 23
            c = str("a+b")
            print(c)
        \end{lstlisting}
        \begin{tasks}(4)
            \task 35
            \task 1223
            \task a+b
            \task 出现错误提示
        \end{tasks}

        % 2
        \item 通过算式$1\times 2^3+1\times 2^2+0\times 2^1+1\times 2^0$可将二进制1101转为十进制,下列进制转换结果正确的是?(\qquad)
        \begin{tasks}(2)
            \task 0b10转为十进制,结果是2
            \task 0d10转为十进制,结果是8
            \task 0x10转为十进制,结果是10
            \task 0o10转为十进制,结果是16
        \end{tasks}

        % 3
        \item 语句\lstinline!float('something')!抛出的异常名称为?(\qquad)
        \begin{tasks}(2)
            \task \lstinline{ValueError}
            \task \lstinline{ImportError}
            \task \lstinline{IndexError}
            \task \lstinline{FileNotFoundError}
        \end{tasks}

        % 4
        \item 在Python语言中,关于\lstinline!bin(0x11)!的功能,下列说法正确的是?(\qquad)
        \begin{tasks}(2)
            \task 将十进制数11转换为二进制
            \task 将十六进制数11转专换为二进制
            \task 将二进制数11转换为十进制
            \task 将十六进制数11转换为十进制
        \end{tasks}
        
        \begin{minipage}{.5\textwidth}
            % 5
            \item 问题如图所示,用计算机解决该问题,比较适合使用?(\qquad)
            \begin{tasks}
                \task 解析算法
                \task 枚举算法
                \task 冒泡算法
                \task 二分查找算法
            \end{tasks}
        \end{minipage}
        \begin{minipage}{.4\textwidth}
            \centering
            \begin{tikzpicture}[scale=0.2]
                \coordinate (A) at (0,0);
                \coordinate (B) at (25,0);
                \coordinate (C) at (20,12);
                \coordinate (D) at (5,12);
                \draw[line width = 1pt,fill = cyan] (A) -- (B) -- (D) --cycle;
                \draw[line width = 1pt] (B) -- (C) -- (D) -- cycle;
                \draw[line width = 1pt] (C) -- (20,14);
                \draw[line width = 1pt] (D) -- (5,14);
                \draw[line width = 1pt, color=gray,<->] (5,13.5) -- node[fill=white]{$15$厘米}(20,13.5);
                \draw[line width = 1pt] (A) -- (0,-2);
                \draw[line width = 1pt] (B) -- (25,-2);
                \draw[line width = 1pt, color=gray,<->] (0,-1.5) -- node[fill=white]{$25$厘米}(25,-1.5);
                \draw (12.5,-5)node{阴影部分面积为150平方厘米,求梯形面积};
            \end{tikzpicture}
        \end{minipage}

        % 6
        \item 将十进制数30转换为十六进制数,最低位上是?(\qquad)
        \begin{tasks}(4)
            \task c
            \task d
            \task e
            \task f
        \end{tasks}

        % 7
        \item 以下表达式的值为\lstinline!False!的是?(\qquad)
        \begin{tasks}(4)
            \task \lstinline!all(())!
            \task \lstinline!all([])!
            \task \lstinline!all((0,))!
            \task \lstinline!all([1,2])!
        \end{tasks}

        % 8
        \item 现在一组初始记录无序的数据\lstinline!"7,9,3,2,5"!使用选择排序算法,按从小到大的顺序排列,则第一轮排序的结果为?(\qquad)
        \begin{tasks}(2)
            \task \lstinline{7,9,3,2,5}
            \task \lstinline{3,2,5,7,9}
            \task \lstinline{2,3,5,7,9}
            \task \lstinline{2,9,3,7,5}
        \end{tasks}

        % 9
        \item 关于\lstinline!hex()!函数,描述不正确的是?(\qquad)
        \begin{tasks}
            \task \lstinline!hex()!函数的功能是将十进制整数转换成十六进制数
            \task \lstinline!hex()!函数的参数是一个十进制数
            \task \lstinline!hex()!函数的返回值是一个十六进制数
            \task \lstinline!hex()!函数的返回值是一个字符串
        \end{tasks}

        % 10
        \item 下列关于表达式的计算结果,不正确的是?(\qquad)
        \begin{tasks}(2)
            \task \lstinline!hex(0x37)!的结果是'0x37'
            \task \lstinline!hex(0o67)!的结果是'0x37'
            \task \lstinline!hex(0b1011)!的结果是'0xb'
            \task \lstinline!hex(int('11',16))!的结果是'0x17'
        \end{tasks}

        % 11
        \item 有如下程序段:
        \begin{lstlisting}
            ls = ['武汉','温州','香港','重庆']
            f = open('city.csv','w')
            f.write(','.join(ls)+'\n')
            f.close()
        \end{lstlisting}
        下列说法正确的是?(\qquad)
        \begin{tasks}
            \task \lstinline!f=open('city.csv','w')!说明当前是读取模式
            \task \lstinline!f.write(','.join(ls)+'\n')!语句改成\lstinline!f.write(' '.join(ls)+'\n')!,结果依然以逗号分隔结
            \task 删除\lstinline!f.close()!语句,也能保存文件
            \task 当前程序的功能是将列表对象输出到CSV文件
        \end{tasks}

        % 12
        \item 异常是指?(\qquad)
        \begin{tasks}(4)
            \task 程序设计时的错误
            \task 程序编写时的错误
            \task 程序编译时的错误
            \task 程序运行时的错误
        \end{tasks}

        % 13
        \item 关于\lstinline!input()!函数,描述不正确的是?(\qquad)
        \begin{tasks}(2)
            \task \lstinline{input()}函数是输入函数
            \task \lstinline{input()}函数的功能是从键盘读入一行文本
            \task \lstinline{input()}函数不需要参数
            \task \lstinline{input()}函数接收到的数据类型是数值类型
        \end{tasks}

        % 14
        \item 有如下程序段
        \begin{lstlisting}
            strSZ = ["语文","数学","英语","科学"]
            str1 = strSZ[1]
            print(str1)
        \end{lstlisting}
        程序运行后,输出的结果是?(\qquad)
        \begin{tasks}(4)
            \task 语文
            \task 数学
            \task 英语
            \task 科学
        \end{tasks}
        
        % 15
        \item \lstinline!print(min(80,100,max(50,60,70)))!的运行结果是?(\qquad)
        \begin{tasks}(4)
            \task 80
            \task 100
            \task 50
            \task 70
        \end{tasks}

        % 16
        \item 下列表达式的结果不为'f'的是?(\qquad)
        \begin{tasks}(4)
            \task \lstinline!'g'-1!
            \task \lstinline!chr(ord('g')-1)!
            \task \lstinline!chr(ord('F')+32)!
            \task \lstinline!chr(ord('G')+31)!
        \end{tasks}

        % 17
        \item 关于查找的说法,下列说法正确的是?(\qquad)
        \begin{tasks}(2)
            \task 序查找要先对数据进行排序
            \task 进行顺序查找,一定能找到数据
            \task 二分查找是一种高效的查找方法
            \task 二分查找法不需要对数据进行排序
        \end{tasks}

        % 18
        \item 用\lstinline!open()!打开文件时,返回的是?(\qquad)
        \begin{tasks}(4)
            \task 列表
            \task 字符串
            \task 文件对象
            \task 元组
        \end{tasks}

        % 19
        \item 打开 a.txt 文件后,将"See you next time."写入文件,下列语句不正确的是?(\qquad)
        \begin{tasks}
            \task \lstinline!f.write('See you next time.\\n')!
            \task \lstinline!f.write(['See','you','next','time','.\\n'])!
            \task \lstinline!f.writelines(['See you next time.\\n'])!
            \task \lstinline!f.writelines(['See','you','next','time','.\\n'])!
        \end{tasks}

        % 20
        \item 运行下列语句后,结果是?(\qquad)
        \begin{lstlisting}
            for i in range(5):
                print(i)
        \end{lstlisting}
        \begin{tasks}(4)
            \task 0\\1\\2\\3\\4
            \task 01234
            \task 1\\2\\3\\4\\5
            \task 12345
        \end{tasks}

        % 21
        \item 若输入指令是\lstinline!list('1234')!,结果是?(\qquad)
        \begin{tasks}(2)
            \task \lstinline!('1','2','3','4')!
            \task \lstinline!['1','2','3','4']!
            \task \lstinline!\{'1','2','3','4'\}!
            \task \lstinline!\{1,2,3,4,\}!
        \end{tasks}

        % 22
        \item 表达式\lstinline!divmod(36,10)!的结果是?(\qquad)
        \begin{tasks}(4)
            \task (3,4)
            \task (6,3)
            \task (3,6)
            \task (4,3)
        \end{tasks}

        % 23
        \item 把文件写入到csv文件的程序段如下:
        \begin{lstlisting}
            ls = ['北京','上海','天津','重庆']
            f = open("city.csv","w")
            #_______________________
            f.write(",".join(row)+'\n')
            f.close()
        \end{lstlisting}
        划线处的代码应该为?(\qquad)
        \begin{tasks}(2)
            \task \lstinline{for i in ls:}
            \task \lstinline{for row in ls:}
            \task \lstinline{for i in range(len(ls)):}
            \task \lstinline{for row in range(len(ls)):}
        \end{tasks}

        % 24
        \item \lstinline{ascii(chr(65))}的值是?(\qquad)
        \begin{tasks}(4)
            \task \lstinline{"a"}
            \task \lstinline{'A'}
            \task \lstinline{"A"}
            \task \lstinline{'B'}
        \end{tasks}

        % 25
        \item \lstinline!int()!函数根据传入的参数创建一个新的整数,下列返回的值不是0的是?(\qquad)
        \begin{tasks}(4)
            \task \lstinline{int(1.0)}
            \task \lstinline{int(0.5)}
            \task \lstinline{int(0)}
            \task \lstinline{int()}
        \end{tasks}
    \end{enumerate}

    \vspace{1cm}
    {\noindent\heiti 第二部分、判断题(共 10 题,每题 2 分,共20分.)}
    \begin{enumerate}
        \setcounter{enumi}{25}
        % 26
        \item 小明准备编写一个程序,把新同学的联系方式保存到一个名为list的现有csv格式文件里。实现这一功能可以使用语句\lstinline{f=open("list.csv","+")}来打开list.csv文件.(\qquad)

        %27
        \item 语句\lstinline{float('2020')}运行后的输出结果是:2020.(\qquad)
        
        %28
        \item 在Python中,代码\lstinline!print('{:8}'.format(12))!中数字8的作用是按8位字符宽度输出数字12.(\qquad)
  
        %29
        \item \lstinline{'$'.join(['张三','李四']).replace(' ','').split('$')}可以去掉列表项中姓名中间的空格.(\qquad)
        
        %30
        \item 二进制数 11110011 转化为十六进制数为 F3.(\qquad)
        
        %31
        \item 在Python中,执行\lstinline!print(ord('a')+12)!语句,能够得到一个数字结果.(\qquad)
        
        %32
        \item \lstinline{round(5566.6)}的结果是5567,所以说\lstinline{round()}函数其实是取整函数.(\qquad)
        
        %33
        \item 数据处理,通常是指利用四则运算中的加、减、乘、除来进行运算,从而得到正确结果.(\qquad)
        
        %34
        \item \lstinline{hex()}函数可以将十进制数转换成十六进制数.在Python交互式编程环境下,执行语句\lstinline{hex(2020)}后,显示的运行结果是'7e4'.(\qquad)
        
        %35
        \item 异常处理结构中,\lstinline{try}程序段中的每一个运行错误语句,都要转移到\lstinline{except}程序段中,执行异常处理语句.(\qquad)
    \end{enumerate}

    \newpage
    {\noindent\heiti 第三部分、编程题(共 3 题,共30分.)}
    \begin{enumerate}
        \setcounter{enumi}{35}
        
        % 36
        \item 请读取1班和2班语文学科的成绩文件\lstinline{"score.csv"}的数据,数据内容如下图显示:
        
        下列代码实现了读取数据并分别统计1班和2班语文成绩的和,请你补全代码.(考生对于本题不需要运行通过,请直接编写代码确认无误后保存答案即可)

        \begin{minipage}{.6\textwidth}
            \begin{lstlisting}
                import csv
                with open("____1____") as f:
                    rows = list(csv.reader(f))
    
                sum1 = 0
                sum2 = 0
                for row in rows[1:]:
                    if int(____2____) == 1:
                        sum1 += int(row[1])
                    else:
                        sum2 += int(row[1])
                print(____3____)
            \end{lstlisting}
        \end{minipage}
        \begin{minipage}{.38\textwidth}
            \centering
            \includegraphics[width=.36\textwidth]{36.png}
        \end{minipage}
        
        \vfill

        %37
        \item 牧场举行联欢会,$n$头奶牛自发举行歌咏比赛.邀请了山羊公公、斑马哥哥、白兔弟弟、小喵妺妺一共四位担任歌咏比赛的评委。评比规则参赛选手的最终得分为所有评委打分的平均分.编程输出每位参赛选手的最终得分,请你补全代码。
        \begin{lstlisting}
            n = int(input())
            for i in range(____1____):
                a = []
                for j in range(0,4):
                    x = int(input())
                    a.append(____2____)
                print(____3____/____4____)
        \end{lstlisting}
        \vfill

        \newpage
        % 38
        \item 科技小组分2个小队搜集到西红柿生长的数据信息.2个小队将数据进行了从小到大排序:
        
        \lstinline{a=[1,3,4,6,7,13,17,21],b=[2,5,6,8,10,12,14,16,18]},
        
        请明明将这2个小队的数据进行合并,生成为一个从小到大有序的列表。
        
        {\heiti 输入}:
        
        1,3,4,6,7,13,17,21

        2,5,6,8,10,12,14,16,18
        
        {\heiti 输出}:

        [1,2,3,4,5,6,6,7,8,10,12,13,14,16,17,18,21]

        请帮明明编写程序实现上述功能,或补全代码.

        \begin{lstlisting}
            x = input()
            s = x.split(',')
            a = []
            for i in range(____1____):
                a.append(int(s[i]))

            y = input()
            s = y.____2____
            b = []
            for i in range(len(s)):
                b.append(int(s[i]))

            ret = []
            i = j = 0
            while len(a) >= i+1 and ____3____:
                if a[i] <= b[j]:
                    ____4____
                    i += 1
                else:
                    ret.append(b[j])
                    j += 1

            if len(a) > i:
                ret += a[i:]
            if len(b) > j:
                ____5____

            print(ret)
        \end{lstlisting}
        
        
    \end{enumerate}

    \newpage
    \begin{center}
        \Huge \heiti 参考答案
    \end{center}

        \begin{tasks}[label=\arabic*.](5)
            \task C %1
            \task A %2
            \task A %3
            \task B %4
            \task A %5

            \task C
            \task C
            \task D
            \task C
            \task D

            \task D
            \task D
            \task D
            \task B
            \task D

            \task A
            \task C
            \task C
            \task B
            \task B

            \task B
            \task C
            \task B
            \task C
            \task A

            \task $\times$
            \task $\times$
            \task $\checkmark$
            \task $\checkmark$
            \task $\checkmark$

            \task $\checkmark$
            \task $\times$
            \task $\times$
            \task $\times$
            \task $\times$
        \end{tasks}

        \begin{enumerate}
            \setcounter{enumi}{35}
            \item \begin{lstlisting}
                "score.csv","r"     #1
                row[0]              #2
                sum1,sum2           #3
            \end{lstlisting}

            \item \begin{lstlisting}
                n       #1
                x       #2
                sum(a)  #3
                4       #4
            \end{lstlisting}

            \item \begin{lstlisting}
                len(s)              #1
                split(',')          #2
                len(b) >= j+1       #3
                ret.append(a[i])    #4
                ret += b[j:]        #5
            \end{lstlisting}
        \end{enumerate}
\end{document}